比起暸解 Istio 還有什麼進階功能,大家應該更迫切想知道如何把 Istio 跟目前團隊的 DevOps 流程相結合。這幾篇會介紹 Argo CD 這個熱門的 DevOps 工具,並且藉由實作了解如何透過此工具將 Istio 融合到 DevOps 流水線。
DevOps 協助開發者和維運人員合作之間能夠更順利,而作法就是將軟體開發週期分為多個階段,並使用自動化工具加速整個開發過程。
開發團隊計畫好了開始實作,完成後透過 CI/CD 工具走過 Build
、Test
、Release
及Deploy
Pipeline,最後交由維運團隊來運行,而 Istio 就能幫助維運人員的 Operate
及 Monitior
部分,例如提供各種路由配置、可視化介面等等。
現在問題是 CI/CD 工具如何與 Istio 相結合,從而實現整個 DevOps 流水線呢?可以從交付給維運人員的 Deploy Pipeline 下手,而本篇要介紹的 Argo CD 就是個強大的 CD 工具,使用後就能輕鬆的完成 Deploy 任務。
Argo CD 是 CNCF 的開源專案,是一種在 Kubernetes 實現 GitOps 的 CD 工具,Argo CD 能夠檢查儲存在 Git Repo 的 Kubernetes 部署檔案,例如 Yaml 檔、Helm 等等,並將其部署到 Kubernetes 中,若使用者需對 Kubernetes 進行更動(Ex: 版本更新、元件增添),只需將更動內容 Commit 到 Repo , Argo CD 就會幫忙自動更新 Kubernetes 的環境。
而 Argo CD 要如何結合 Istio?除了能夠將 Istio 所需的 Virtual Service、Destination Rule 及 Gateway 透過 GitOps 的方式管理,還能藉由 Argo Rollouts 功能幫助我們自動化實現 Canary Deployment
、Blue/Green Deployment
等部署策略,將 Deploy 與 Operate Pipeline 連接起來,從而實現完整的 DevOps 流水線。
去年鐵人賽筆者也有寫一篇使用 Argo CD 部署應用程式的教學,有興趣可以從 Day21 - ArgoCD 介紹及安裝 開始看起
在開始學習如何使用 Argo CD 前,要先將其安裝到我們的實驗環境,安裝方式參考 Argo CD getting started,下面紀錄了筆者在 Minikube 安裝 Argo CD 的流程。
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl get pods -n argocd
(輸出結果)
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 23m
argocd-applicationset-controller-6b4b7969b8-wzckz 1/1 Running 0 23m
argocd-dex-server-6445d44bd9-5ldbs 1/1 Running 0 23m
argocd-notifications-controller-98464fc99-sjcbs 1/1 Running 0 23m
argocd-redis-5dff748d9c-2vml6 1/1 Running 0 23m
argocd-repo-server-7778dffc44-29drj 1/1 Running 0 23m
argocd-server-5f687c8b99-27n4v 1/1 Running 0 23m
等到所有 Pod 都為 Running 就完成 Argo CD 的部署了
部署完 Argo CD 後,要怎麼連接到 UI 介面,除了可以設置 Ingress 之外,也能使用 LoadBalancer Service,這裡我們使用相對簡單的後者。
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
kubectl get svc argocd-server -n argocd
(輸出結果)
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-server LoadBalancer 10.101.165.30 <pending> 80:30735/TCP,443:32482/TCP 25m
在 Day15 的 Gateway 介紹中有提到,若要讓 Minikube 內部 Services 取得 External-IP,可以使用 Minikube Tunnel 功能將 IP 分發給 LoadBalancer Services。
minikube tunnel
(輸出結果)
Status:
machine: minikube
pid: 652382
route: 10.96.0.0/12 -> 192.168.49.2
minikube: Running
services: [argocd-server, istio-ingressgateway]
errors:
minikube: no errors
router: no errors
loadbalancer emulator: no errors
Logs 中可看到有 Minikube Tunnel 設置了 Route 讓我們可以連接到 argocd-server
kubectl get svc argocd-server -n argocd
(輸出結果)
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-server LoadBalancer 10.101.165.30 10.101.165.30 80:30735/TCP,443:32482/TCP 27m
在 EXTERNAL-IP 欄位即可取得 argocd-server 的 IP
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
(輸出結果)
qDdOTiyvwNMMlzrE
https://<ARGOCD_SERVER_EXTERNAL-IP>
登入之後即可看到 Argo CD UI 介面。
本篇介紹了 Argo CD 能幫助我們將 DevOps 流水線中的 Deploy 與 Operate 接合起來,至於要如何實現,下一篇就會介紹其中的關鍵功能:Argo Rollouts。